def add(a,b):
    sums = a+b
    print(sums)
add(10,20)
add(10)   # TypeError: add() missing 1 required positional argument: 'b'  缺少一个参数
add(10,20,30)  # TypeError: add() takes 2 positional arguments but 3 were given  只需要两个但是你给了三个
def reduces(a,b):  # 相减
    redu = a-b
    print(redu)
reduces(20,10) # a = 20 b = 10
reduces(10,20) # a = 10 b = 20
"""
必备参数(位置参数)
1.在定义的时候传了几个参数那么在调用的时候就要传几个参数(不能多传或者是少传)
2.在传参数的时候按照参数的位置顺序一一对应(按照从左到右依次赋值)
"""
def reduces(a=20,b=10):  # 相减
    redu = a-b
    print(redu)
# reduces(20)  # a = 20 b = 10
reduces(10) # a = 10 b = 10
"""
默认参数(缺省参数)
1.在定义形参的时候给参数一个默认值，如果在调用的时候没有给这个值的话就使用默认的值
2.如果定义了位置参数和默认参数，那么默认参数一定在后面
3.如果调用的时候给了默认参数值，那么值会覆盖掉默认参数的值
"""
def reduces(*args):   # args是我们习惯性用法 你里面用什么都行
    print(args)
    # 循环遍历 拿到每一个数据
# reduces(20,10,20,30,40)
reduces(20,10,20)
# 不定义参数：如果不确定调用的时候要传多少个参数
"""
可变参数
1.*args格式会自动打包成元组格式的数据
2.*是一个语法糖，但是一种写法(*a,*b)
3.可以传任意长度的参数
"""
def reduces(**kwargs):
    print(kwargs)
    # 循环遍历 拿到每一个数据
reduces(name="zeno",age=18) # 键(属性)=值
"""
关键字参数
1.**kwargs格式会自动打包成一个字典格式的数据(键和值)
2.**是一个语法糖
3.可以传任意长度的参数
"""
# 位置参数、默认参数、可变参数、关键字参数(随意组合)
"""
1.如果有位置参数那么位置参数放在最前面
2.如果有关键字参数那么关键字参数放到最后面
"""